// 基础类型推断-在TS中是比较常见的类型推断

// 通常发生在以下的场景

// 比如说在初始化一个变量的时候

let a; // any 类型（TS自动推导出来的）
let a1 = 1; // number 类型
let b = []; // 就会被推导为已any类型为元素的数组类型
let b1 = [1]; // 那么它就会被推断为一个 number 类型的数组

// 那么接着呢还有一种情况就是发生在设置函数默认参数的时候
let c = (x = 1) => {
  // 那么这时候类型推断也发生了 x 被推断为number类型
};

// 还有呢在确定函数返回值的时候也会发生类型推断
let c1 = (x = 1) => x + 1; // 那么 c1 它的返回值类型就会被推断为number类型

// 最佳通用类型推断

// 当需要从多个类型中推断出一个类型的时候呢，TS就会尽可能的推断出一个兼容当前所有类型的通用类型

let b2 = [1, null]; // number和null两种类型是不兼容的，所以b2就会被推断为 number和null 的联合类型

// 以上的推断呢都是从右到左的推断，也就是根据表达式右侧的值来推断表达式左侧变量的类型

// 那么还有一个推断呢，它的反向是相反的也就是从左到右，这个呢就是`上下文类型推断`，它呢通常是发生在一个事件处理中

// 比如呢我们给window绑定一个事件

window.onkeydown = (event) => {
  // 这个时候呢就会发生上下文的类型推断，TS会根据左侧的事件绑定类推断出右侧事件的类型，这时候类型就会被推断为一个`KeyboardEvent`
  // 同时呢它也知道相应的属性是什么，比如说我们打印出来 event 的一些属性，它也会提示我们键盘事件它有哪些属性
  console.log(event.bubbles);
}

